home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 0.9.1.3 stable / flock-0.9.1.3.en-US.win32.exe / flock / components / flockBlogWebServiceMetaweblog.js < prev    next >
Text File  |  2007-10-12  |  18KB  |  520 lines

  1. // BEGIN FLOCK GPL
  2. // 
  3. // Copyright Flock Inc. 2005-2007
  4. // http://flock.com
  5. // 
  6. // This file may be used under the terms of of the
  7. // GNU General Public License Version 2 or later (the "GPL"),
  8. // http://www.gnu.org/licenses/gpl.html
  9. // 
  10. // Software distributed under the License is distributed on an "AS IS" basis,
  11. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. // for the specific language governing rights and limitations under the
  13. // License.
  14. // 
  15. // END FLOCK GPL
  16. //
  17.  
  18.  
  19. const Cc = Components.classes;
  20. const Ci = Components.interfaces;
  21.  
  22. const FLOCK_MW_CID =  Components.ID('{143c7ec8-6ae9-473a-9289-e19321bfa72e}');
  23. const FLOCK_MW_CONTRACTID = '@flock.com/blog/service/metaweblog;1';
  24. const FLOCK_MW_DESCRIPTION = 'MetaWeblog';
  25.  
  26. const FLOCK_BLOG_RDF_SETTINGS     = 'urn:flock:blog:settings';
  27.  
  28. function loadLibraryFromSpec(aSpec) {
  29.   var loader = Components.classes['@mozilla.org/moz/jssubscript-loader;1']
  30.     .getService(Components.interfaces.mozIJSSubScriptLoader);
  31.  
  32.   loader.loadSubScript(aSpec);
  33. }
  34.  
  35. loadLibraryFromSpec("chrome://browser/content/flock/blog/technoratiTags.js");
  36. loadLibraryFromSpec("chrome://browser/content/flock/blog/blogBackendLib.js");
  37. loadLibraryFromSpec("chrome://browser/content/flock/xmlrpc/xmlrpchelper.js");
  38.  
  39. // CONSTRUCTOR
  40. function metaweblogWebService () {
  41.   //this.mQueue = null;
  42.  
  43.   // set attributes
  44.   this.name = 'MetaWeblog';
  45.   this.shortName = 'metaweblog';
  46.   this.description = "The MetaWeblog API"
  47.   this.supportsCategories = 2;
  48.   this.supportsPostReplace = true;
  49.   this.appKey = "";
  50.  
  51.   // Logger
  52.   this.logger = Components.classes['@flock.com/logger;1']
  53.     .createInstance(Components.interfaces.flockILogger);
  54.   this.logger.init("blog");
  55. }
  56.  
  57. // the nsISupports implementation
  58. metaweblogWebService.prototype.QueryInterface = function (iid) {
  59.   if (iid.equals(Ci.flockICustomBlogWebService) ||
  60.       iid.equals(Ci.flockIBlogWebService) || 
  61.       iid.equals(Ci.flockIWebService) || 
  62.       iid.equals(Ci.nsIClassInfo) || 
  63.       iid.equals(Ci.nsISupports)) {
  64.     return this;
  65.   }
  66.  
  67.   throw Components.results.NS_ERROR_NO_INTERFACE;
  68. }
  69.  
  70.  
  71. // PRIVATE METHODS
  72.  
  73. function unescapeXML(aString) {
  74.   var result = aString;
  75.    result = result.replace(/�*34;/, '"');
  76.    result = result.replace(/�*38;/, '&');
  77.    result = result.replace(/�*39;/, "'");
  78.    result = result.replace(/�*60;/, "<");
  79.    result = result.replace(/�*62;/, ">");
  80.    result = result.replace(/ /, " ");
  81.    result = result.replace(/­/, "-");
  82.   return result;
  83. }
  84.  
  85. metaweblogWebService.prototype.xmlrpc = function() {
  86.   var listener = arguments[0];   
  87.   var url = arguments[1];   
  88.   var call = arguments[2];   
  89.  
  90.   var params = new Array();
  91.  
  92.   for(var i=3;i<arguments.length;++i)
  93.   {
  94.     params[params.length] = arguments[i];
  95.   }
  96.   var rpc = new JSXMLRPC();
  97.  
  98.   var logMessage = ">>>>>>>>>> MetaWeblog API: FLOCK TO SERVER\n";
  99.   logMessage += "  URL: " + url + "\n";
  100.   logMessage += "  CALL: " + call + "\n";
  101.   for (i in params)
  102.     logMessage += "  params["+i+"] = "+params[i]+"\n";
  103.   this.logger.info(logMessage);
  104.   
  105.   rpc.call(listener, url, call, params);
  106. }
  107.  
  108. // Listeners
  109. function blogListener(aListener, aBool){
  110.   this.listener = aListener;
  111.   this.container = aBool;
  112.   this.logger = Components.classes['@flock.com/logger;1']
  113.     .createInstance(Components.interfaces.flockILogger);
  114.   this.logger.init("blog");
  115. }
  116.  
  117. blogListener.prototype = 
  118. {
  119.   // aResult is an Array of struct objects
  120.   onResult: function(aResult) {
  121.     this.logger.info("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  122.     for (i=0; i<aResult.length; i++){
  123.       this.logger.debug("Entry\n");
  124.       var entry = aResult[i];
  125.       for (j in entry)
  126.         this.logger.debug("  -> "+j+": "+entry[j]+"\n");
  127.     }
  128.     // Create an in-memory datasource
  129.     var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"]
  130.       .getService(Components.interfaces.nsIRDFService);
  131.     var rdf = Components.classes["@mozilla.org/rdf/datasource;1?name=in-memory-datasource"].createInstance(Components.interfaces.nsIRDFDataSource);
  132.     var rdfContainerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"]
  133.       .getService(Components.interfaces.nsIRDFContainerUtils);
  134.     // Fill it with the results
  135.     if (this.container)
  136.       var container = rdfContainerUtils.MakeSeq(rdf, rdfService.GetResource("urn:flock:blog:elements"));
  137.     for (i=0; i<aResult.length; i++){
  138.       var id='obj_' + Math.round(10000*Math.random())
  139.       var subject = rdfService.GetResource("http://www.flock.com/rdf/"+id);
  140.       var entry = aResult[i];
  141.       for (j in entry){
  142.         var predicate = rdfService.GetResource("http://www.flock.com/rdf/"+j);
  143.         //if (typeof entry[j] == 'string')
  144.         //  entry[j] = unescapeXML(entry[j]);
  145.         var name = rdfService.GetLiteral(entry[j]);
  146.         
  147.         rdf.Assert(subject, predicate, name, true);
  148.       }
  149.       if (this.container)
  150.         container.AppendElement(subject);
  151.     }
  152.  
  153.     // and return the data source through the listener
  154.     this.listener.onResult(rdf);
  155.   },
  156.   onError: function(error) {
  157.     this.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  158.     this.logger.error("ERROR "+error+"\n");
  159.     this.listener.onError(error);
  160.   }, 
  161.   onFault: function(error) {
  162.     this.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  163.     this.logger.error("FAULT "+error+"\n");
  164.     this.listener.onFault(error);
  165.   } 
  166. }
  167.  
  168. function blogCategoryListener(aListener, aBool){
  169.   this.listener = aListener;
  170.   this.container = aBool;
  171.   this.logger = Cc['@flock.com/logger;1']
  172.     .createInstance(Ci.flockILogger);
  173.   this.logger.init("blog");
  174. }
  175.  
  176. blogCategoryListener.prototype = 
  177. {
  178.   onResult: function(aResult) {
  179.     this.logger.info("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  180.     var result = new Array();
  181.     for (i=0; i<aResult.length; i++){
  182.       this.logger.debug("Entry\n");
  183.       var entry = aResult[i];
  184.       for (j in entry)
  185.         this.logger.debug("  -> "+j+": "+entry[j]+"\n");
  186.     }
  187.     for (i=0; i<aResult.length; i++){
  188.       this.logger.debug("Found the category "+aResult[i].description+"\n");
  189.       var category = new BlogCategory(i, aResult[i].description);
  190.       result.push(category);
  191.     }
  192.  
  193.     // and return the data source through the listener
  194.     this.listener.onResult(new simpleEnumerator(result));
  195.   },
  196.   onError: function(errorcode, errormsg) {
  197.     this.logger.error("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  198.     this.logger.error("ERROR "+errorcode+" "+errormsg+"\n");
  199.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  200.     error.serviceErrorCode = errorcode;
  201.     error.serviceErrorString = errormsg;
  202.     this.listener.onError(error);
  203.   }, 
  204.   onFault: function(errorcode, errormsg) {
  205.     this.logger.error("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  206.     this.logger.error("FAULT "+errorcode+" "+errormsg+"\n");
  207.     var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  208.     error.serviceErrorCode = errorcode;
  209.     error.serviceErrorString = errormsg;
  210.     this.listener.onFault(error);
  211.   } 
  212. }
  213.  
  214. metaweblogWebService.prototype.detectAccount = function (aUrl, aLinkList){
  215.   return null;
  216. }
  217.  
  218.  
  219. metaweblogWebService.prototype.newPost = function(aListener, aBlogId, aPost, aPublish, aNotifications){
  220.   var gBlogService = Cc['@flock.com/flock-blog;1'].getService(Ci.flockIBlogService);
  221.   var account = gBlogService.getAccount(aBlogId);
  222.  
  223.   var svc = this;
  224.  
  225.   var notifsArray = [];
  226.   var catArray = [];
  227.   var html = aPost.description + addTechnoratiTags(aPost.tags);
  228.   while (aPost.categories.hasMoreElements()) {
  229.     var category = aPost.categories.getNext();
  230.     category.QueryInterface(Ci.flockIBlogCategory);
  231.     catArray.push(category.label);
  232.   }
  233.  
  234.   var listener = {
  235.     onResult: function(aResult) {
  236.       aListener.onResult(aResult);
  237.     },
  238.     onError: function(error) {
  239.       svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  240.       svc.logger.error("ERROR "+error+"\n");
  241.       aListener.onError(error);
  242.     }, 
  243.     onFault: function(error) {
  244.       svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  245.       svc.logger.error("FAULT "+error+"\n");
  246.       aListener.onFault(error);
  247.     } 
  248.   };
  249.  
  250.   var xmlrpcServer = new flockXmlRpcServer (account.apiLink);
  251.   var args = [account.blogid, account.username, account.password, 
  252.               {title: aPost.title, description: html, categories: catArray,
  253.                mt_convert_breaks: "", mt_tb_ping_urls: notifsArray}, aPublish];
  254.   xmlrpcServer.call("metaWeblog.newPost", args, listener);
  255. }
  256.  
  257. metaweblogWebService.prototype.editPost = function(aListener, aBlogId, aPost, aPublish, aNotifications){
  258.   var gBlogService = Cc['@flock.com/flock-blog;1'].getService(Ci.flockIBlogService);
  259.   var account = gBlogService.getAccount(aBlogId);
  260.   var catArray = [];
  261.  
  262.   var svc = this;
  263.   var listener = {
  264.     onResult: function(aResult) {
  265.       aListener.onResult(aResult);
  266.     },
  267.     onError: function(error) {
  268.       svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  269.       svc.logger.error("ERROR "+error+"\n");
  270.       aListener.onError(error);
  271.     }, 
  272.     onFault: function(error) {
  273.       svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  274.       svc.logger.error("FAULT "+error+"\n");
  275.       aListener.onFault(error);
  276.     } 
  277.   };
  278.  
  279.   var notifsArray = new Array();
  280.   var html = aPost.description + addTechnoratiTags(aPost.tags);
  281.   while (aPost.categories.hasMoreElements()) {
  282.     var category = aPost.categories.getNext();
  283.     category.QueryInterface(Ci.flockIBlogCategory);
  284.     catArray.push(category.label);
  285.   }
  286.  
  287.   var xmlrpcServer = new flockXmlRpcServer (account.apiLink);
  288.   var args = [aPost.postid, account.username, account.password, 
  289.               {title: aPost.title, description: html, categories: catArray,
  290.                dateCreated: new Date(parseInt(aPost.issued))}, aPublish];
  291.   xmlrpcServer.call("metaWeblog.editPost", args, listener);
  292. }
  293.  
  294. metaweblogWebService.prototype.deletePost = function(aListener, aAccount, aPostid){
  295.   dump("***** metaweblogWebService.deletePost: not supported!\n");
  296. }
  297.  
  298. metaweblogWebService.prototype.getPost = function(aListener, aAccount, aPostid){
  299.   var listener = new blogListener(aListener, false);
  300.   var xmlrpcServer = new flockXmlRpcServer (aAccount.apiLink);
  301.   var args = [aPostid, aAccount.username, aAccount.password];
  302.   xmlrpcServer.call("metaWeblog.getPost", args, listener);
  303. }
  304.  
  305. metaweblogWebService.prototype.getUsersBlogs = function(aListener, aAccount){
  306.   var svc = this;
  307.   var listener = {
  308.     // aResult is an Array of struct objects
  309.     onResult: function(aResult) {
  310.       var result = new Array();
  311.       for (i=0; i<aResult.length; i++){
  312.         var entry = aResult[i];
  313.         var newAccount = new BlogAccount(entry.blogName);
  314.         newAccount.blogid = entry.blogid;
  315.         newAccount.apiLink = "";
  316.         newAccount.URL = entry.url;
  317.         result.push(newAccount);
  318.       }
  319.       aListener.onSuccess(new simpleEnumerator(result), null);
  320.     },
  321.     onError: function(errorcode, errormsg) {
  322.       svc.logger.error("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  323.       svc.logger.error("ERROR "+errorcode+" "+errormsg+"\n");
  324.       var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  325.       error.serviceErrorCode = errorcode;
  326.       error.serviceErrorString = errormsg;
  327.       aListener.onError(null, "", error);
  328.     }, 
  329.     onFault: function(errorcode, errormsg) {
  330.       svc.logger.error("<<<<<<<<<< Metaweblog API: SERVER TO FLOCK\n");
  331.       svc.logger.error("FAULT "+errorcode+" "+errormsg+"\n");
  332.       var error = Cc['@flock.com/error;1'].createInstance(Ci.flockIError);
  333.       error.serviceErrorCode = errorcode;
  334.       error.serviceErrorString = errormsg;
  335.       switch (errorcode) {
  336.         case 403: // Invalid login/pass
  337.         case 801: // At least dotclear uses code 801 for bad auth
  338.           error.errorCode = Ci.flockIError.BLOG_INVALID_AUTH;
  339.           error.errorString = "Bad authentication";
  340.           break;
  341.         default: // Unknown error code
  342.           error.errorCode = Ci.flockIError.BLOG_UNKNOWN;
  343.           error.errorString = "Unknown Error";
  344.       }
  345.       aListener.onError(null, "", error);
  346.     } 
  347.   }
  348.   
  349.   var xmlrpcServer = new flockXmlRpcServer (aAccount.apiLink);
  350.   var args = [this.appKey, aAccount.username, aAccount.password];
  351.   xmlrpcServer.call("blogger.getUsersBlogs", args, listener);
  352. }
  353.  
  354. metaweblogWebService.prototype.getRecentPosts = function(aListener, aBlogId, aNumber){
  355.   var gBlogService = Cc['@flock.com/flock-blog;1'].getService(Ci.flockIBlogService);
  356.   var account = gBlogService.getAccount(aBlogId);
  357.  
  358.   var listener = {
  359.     onResult: function(aResult) {
  360.       var result = new Array();
  361.       // svc.logger.info("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  362.       for (i=0; i<aResult.length; i++) {
  363.         var post = new BlogPost();
  364.         post.title = aResult[i].title;
  365.         post.issued = aResult[i].dateCreated.getTime();
  366.         post.postid = aResult[i].postid;
  367.         result.push(post);
  368.       }
  369.  
  370.       // and return the data source through the listener
  371.       aListener.onResult(new simpleEnumerator(result));
  372.     },
  373.     onError: function(error) {
  374.       //svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  375.       //svc.logger.error("ERROR "+error+"\n");
  376.       aListener.onError(error);
  377.     }, 
  378.     onFault: function(error) {
  379.       //svc.logger.error("<<<<<<<<<< MetaWeblog API: SERVER TO FLOCK\n");
  380.       //svc.logger.error("FAULT "+error+"\n");
  381.       aListener.onFault(error);
  382.     } 
  383.   }
  384.  
  385.   var xmlrpcServer = new flockXmlRpcServer (account.apiLink);
  386.   var args = [account.blogid, account.username, account.password, aNumber];
  387.   xmlrpcServer.call("metaWeblog.getRecentPosts", args, listener);
  388. }
  389.  
  390. metaweblogWebService.prototype.getCategoryList = function(aListener, aBlogId){
  391.   var gBlogService = Cc['@flock.com/flock-blog;1'].getService(Ci.flockIBlogService);
  392.   var account = gBlogService.getAccount(aBlogId);
  393.  
  394.   var svc = this;
  395.   var listener = new blogCategoryListener(aListener, false);
  396.   var xmlrpcServer = new flockXmlRpcServer (account.apiLink);
  397.   var args = [account.blogid, account.username, account.password];
  398.   xmlrpcServer.call("metaWeblog.getCategories", args, listener);
  399. }
  400.  
  401.  
  402. metaweblogWebService.prototype.removeAccount = function (aId) {
  403.   if (!this.logger)
  404.     this.setup();
  405.  
  406.   var faves_coop = Cc['@flock.com/singleton;1'].getService(Ci.flockISingleton).getSingleton('chrome://browser/content/flock/common/load-faves-coop.js').wrappedJSObject;
  407.   var acUtils = Cc["@flock.com/account-utils;1"].getService(Ci.flockIAccountUtils);
  408.   var pm = Cc["@mozilla.org/passwordmanager;1"].getService(Ci.nsIPasswordManager);
  409.  
  410.   var account = faves_coop.get(aId);
  411.   
  412.   this.logger.debug("REMOVE: "+aId+" - "+account.accountId);
  413.  
  414.   // Remove the password
  415.   try {
  416.     pm.removeUser(aId, account.accountId);
  417.   }
  418.   catch(e) {
  419.     this.logger.warn("Exception trying to remove the password. It may have been already deleted.");
  420.   }
  421.  
  422.   // Destroy the blogs and the account
  423.   var _enum = account.children.enumerate();
  424.   while (_enum.hasMoreElements()) {
  425.     var blog = _enum.getNext();
  426.     account.children.remove(blog);
  427.     blog.destroy();
  428.   }
  429.   
  430.   account.destroy();
  431. }
  432.  
  433. // That a bit hacky, a way to not break flockAccountUtils.removeAllAccounts
  434. metaweblogWebService.prototype.getAccount = function (aId) {
  435.   return {
  436.     logout: function(aArg) { return; },
  437.     getInterfaces: function (count) {
  438.       var interfaceList = [Ci.nsISupports, Ci.flockIWebServiceAccount, Ci.flockIBlogWebServiceAccount];
  439.       count.value = interfaceList.length;
  440.       return interfaceList;
  441.     },
  442.     QueryInterface: function (iid) {
  443.       if (!iid.equals(Ci.nsISupports) &&
  444.         !iid.equals(Ci.flockIWebServiceAccount) &&
  445.         !iid.equals(Ci.flockIBlogWebServiceAccount)) {
  446.         throw Components.results.NS_ERROR_NO_INTERFACE;
  447.       }
  448.       return this;
  449.     }
  450.   }
  451. }
  452.  
  453.  
  454. metaweblogWebService.prototype.flags = Ci.nsIClassInfo.SINGLETON;
  455. metaweblogWebService.prototype.contractID = FLOCK_MW_CONTRACTID;
  456. metaweblogWebService.prototype.classDescription = "Flock Metaweblog API Service";
  457. metaweblogWebService.prototype.getInterfaces = function (count) {
  458.   var interfaceList = [Ci.flockIWebService,
  459.     Ci.flockICustomBlogWebService,
  460.     Ci.flockIBlogWebService,
  461.       Ci.nsIClassInfo,
  462.       Ci.nsISupports];
  463.   count.value = interfaceList.length;
  464.   return interfaceList;
  465. }
  466. metaweblogWebService.prototype.getHelperForLanguage = function (count) {return null;}
  467.  
  468. // Module implementation
  469. var MetaweblogModule = new Object();
  470.  
  471. MetaweblogModule.registerSelf =
  472. function (compMgr, fileSpec, location, type)
  473. {
  474.   compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  475.  
  476.   compMgr.registerFactoryLocation(FLOCK_MW_CID, 
  477.                   "Flock MetaWeblog JS Component",
  478.                   FLOCK_MW_CONTRACTID, 
  479.                   fileSpec, 
  480.                   location,
  481.                   type);
  482.   //necessary category registration
  483.   var catmgr = Components.classes["@mozilla.org/categorymanager;1"]
  484.     .getService (Components.interfaces.nsICategoryManager);
  485.   catmgr.addCategoryEntry('flockICustomBlogWebService', 'metaweblog', FLOCK_MW_CONTRACTID, true, true);
  486. }
  487.  
  488. MetaweblogModule.getClassObject =
  489. function (compMgr, cid, iid) {
  490.   if (!cid.equals(FLOCK_MW_CID))
  491.     throw Components.results.NS_ERROR_NO_INTERFACE;
  492.   
  493.   if (!iid.equals(Components.interfaces.nsIFactory))
  494.     throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  495.   
  496.   return MetaweblogServiceFactory;
  497. }
  498.  
  499. MetaweblogModule.canUnload =
  500. function(compMgr)
  501. {
  502.   return true;
  503. }
  504.   
  505. // factory object
  506. var MetaweblogServiceFactory = new Object();
  507.  
  508. MetaweblogServiceFactory.createInstance =
  509. function (outer, iid) {
  510.   if (outer != null)
  511.     throw Components.results.NS_ERROR_NO_AGGREGATION;
  512.  
  513.   return (new metaweblogWebService()).QueryInterface(iid);
  514. }
  515.  
  516. /* entrypoint */
  517. function NSGetModule(compMgr, fileSpec) {
  518.   return MetaweblogModule;
  519. }
  520.